package org.harlov.testsys.views;

//Фабрика GUI

import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Toolkit;
import java.awt.event.ActionListener;
import java.util.Vector;

import javax.swing.DefaultListCellRenderer;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JProgressBar;
import javax.swing.JSpinner;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SpinnerNumberModel;
import javax.swing.border.LineBorder;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.TableModel;

import org.harlov.testsys.db.test_loger;

public class gui_factory {
	
		Vector<JComponent> obj_lst = new Vector<JComponent>();
		Vector<JCheckBox> combo_lst = new Vector<JCheckBox>();
		private int b_width = 200 , b_height = 50 ; //Стандартные размеры кнопки
		private int l_width = 100 , l_height = 50;	// метки
		private int t_width = 200 , t_height = 20;	//поля ввода
		private int pf_width = 200, pf_height = 20; //поля ввода пароля
		private int cb_width = 200, cb_height = 20;
		private int ls_width = 200, ls_height = 500;
		private int tbl_width = 200 , tbl_height = 500;
		private JFrame mFrame;

		
		private void setHFont(JComponent temp) {
			
		//	temp.setFont(new Font("Times New Roman",Font.PLAIN,16));
		}
		
		
		public gui_factory(JFrame frame) {
			mFrame = frame;
		}
	
		public JButton newButton(String text,String name,int x,int y,ActionListener event)	{ //Кнопка
			
			JButton temp_button = new javax.swing.JButton();
			temp_button.setText(text);
			temp_button.setSize(b_width,b_height);
			temp_button.setLocation(x, y);
			temp_button.setVisible(true);
			temp_button.setName(name);
			temp_button.addActionListener(event);
			setHFont(temp_button);
			
			this.mFrame.add(temp_button);
			obj_lst.add(temp_button);
			return temp_button;
		}
		
		public JButton newButton(String text,String name,int x,int y,int width,int height, ActionListener event)	{ //Кнопка с размерами
			
			JButton temp_button = new javax.swing.JButton();
			temp_button.setText(text);
			temp_button.setSize(width,height);
			temp_button.setLocation(x, y);
			temp_button.setVisible(true);
			temp_button.setName(name);
			temp_button.addActionListener(event);
			setHFont(temp_button);
			
			this.mFrame.add(temp_button);
			obj_lst.add(temp_button);
			return temp_button;
		}
		
		public JLabel newLabel(String text,String name,int x, int y) { //Метка
			JLabel temp_label = new javax.swing.JLabel();
			temp_label.setText(text);
			temp_label.setLocation(x, y);
			temp_label.setVisible(true);
			temp_label.setName(name);
			setHFont(temp_label);
			temp_label.setSize(l_width, l_height);
			this.mFrame.add(temp_label);
			obj_lst.add(temp_label);
			return temp_label;
			
		}
		
		public JLabel newLabel(String text,String name,int x, int y,int width,int height) { //Метка с размерами
			JLabel temp_label = new javax.swing.JLabel();
			temp_label.setText(text);
			temp_label.setLocation(x, y);
			temp_label.setVisible(true);
			setHFont(temp_label);
			temp_label.setName(name);
			temp_label.setSize(width, height);
			this.mFrame.add(temp_label);
			obj_lst.add(temp_label);
			return temp_label;
			
		}
		
		public JTextField newText (String name,int x, int y) { //Текстовое поле
			JTextField temp_field = new JTextField();
			temp_field.setName(name);
			temp_field.setLocation(x, y);
			temp_field.setVisible(true);
			setHFont(temp_field);
			temp_field.setSize(t_width,t_height);
			
			this.mFrame.add(temp_field);
			obj_lst.add(temp_field);
			return temp_field;
		}
		
		public JTextField newText (String name,int x, int y,int width,int height) { //Текстовое поле с размерами
			JTextField temp_field = new JTextField();
			temp_field.setName(name);
			temp_field.setLocation(x, y);
			temp_field.setVisible(true);
			temp_field.setSize(width,height);
			setHFont(temp_field);
			this.mFrame.add(temp_field);
			obj_lst.add(temp_field);
			return temp_field;
		}
		
		public JPasswordField newPassField(String name,int x, int y) { //Поле ввода пароля
			JPasswordField temp_pass = new JPasswordField();
			temp_pass.setName(name);
			temp_pass.setLocation(x, y);
			temp_pass.setVisible(true);
			temp_pass.setSize(pf_width, pf_height);
			setHFont(temp_pass);
			this.mFrame.add(temp_pass);
			obj_lst.add(temp_pass);
			return temp_pass;
		}
		
		public JList newList (String name,DefaultListModel model,int x,int y,ListSelectionListener event) { //Список
			JList temp_list = new JList(model);
			temp_list.setName(name);
			temp_list.setSize(ls_width, ls_height);
			temp_list.setLocation(x, y);
			setHFont(temp_list);
			temp_list.addListSelectionListener(event);
			temp_list.setBorder(new LineBorder(new Color(0,0,0),1));
			obj_lst.add(temp_list);
			this.mFrame.add(temp_list);
			return temp_list;
		}
		
		public JList newList (String name,DefaultListModel model,int x,int y,int width,int height,ListSelectionListener event) { //Список
			JList temp_list = new JList(model);
			temp_list.setName(name);
			temp_list.setSize(width, height);
			temp_list.setLocation(x, y);
			setHFont(temp_list);
			
			temp_list.setBorder(new LineBorder(new Color(0,0,0),1));
			obj_lst.add(temp_list);
			this.setSelList(name, 0);
			temp_list.addListSelectionListener(event);
			this.mFrame.add(temp_list);
			temp_list.repaint();
			return temp_list;
		}
		
		
		public JList newList (String name,DefaultListModel model,int x,int y,int width,int height,ListSelectionListener event,DefaultListCellRenderer lol) { //Список
			JList temp_list = new JList(model);
			temp_list.setName(name);
			temp_list.setCellRenderer(lol);
			temp_list.setSize(width, height);
			temp_list.setLocation(x, y);
			setHFont(temp_list);
			temp_list.addListSelectionListener(event);
			temp_list.setBorder(new LineBorder(new Color(0,0,0),1));
			obj_lst.add(temp_list);
			this.mFrame.add(temp_list);
			return temp_list;
		}
		
		public JList newList (String name,DefaultListModel model,int x,int y) { //Список
			JList temp_list = new JList(model);
			temp_list.setName(name);
			temp_list.setSize(ls_width, ls_height);
			temp_list.setLocation(x, y);
			setHFont(temp_list);
			temp_list.setBorder(new LineBorder(new Color(0,0,0),1));
			obj_lst.add(temp_list);
			this.mFrame.add(temp_list);
			return temp_list;
		}
		
		public void delSel(String name) {
			JList temp = (JList) this.getObject(name);
			temp.setSelectedIndex(-1);
		}
				
		
		
		public JTable newTable (String name,TableModel model,int x, int y) { //Таблица
			JTable temp_table = new JTable(model);
			temp_table.setName(name);
			temp_table.setSize(tbl_width, tbl_height);
			temp_table.setLocation(x, y);
			setHFont(temp_table);
			temp_table.setBorder(new LineBorder(new Color(0,0,0),1));
			obj_lst.add(temp_table);
			this.mFrame.add(temp_table);
			return temp_table;
		}
		
		public JTable newTable (String name,TableModel model,int x, int y,int width,int height) { //Таблица с размерами
			JTable temp_table = new JTable(model);
			temp_table.setName(name);
			temp_table.setSize(width,height);
			temp_table.setLocation(x, y);
			temp_table.setBorder(new LineBorder(new Color(0,0,0),1));
			obj_lst.add(temp_table);
			setHFont(temp_table);
			this.mFrame.add(temp_table);
			return temp_table;
		}
		
		public JTable newTable (String name,TableModel model,int x, int y,int width,int height,ListSelectionListener event) { //Таблица с размерами
			JTable temp_table = new JTable(model);
			temp_table.setName(name);
			temp_table.setSize(width,height);
			temp_table.getSelectionModel().addListSelectionListener(event);
			temp_table.setLocation(x, y);
			temp_table.setBorder(new LineBorder(new Color(0,0,0),1));
			obj_lst.add(temp_table);
			setHFont(temp_table);
			this.mFrame.add(temp_table);
			return temp_table;
		}
		
		public JComboBox newComboBox(String name,Vector<String> data, int x, int y) { //Выпадающий список
			
			JComboBox temp_combo = new JComboBox(data);
			temp_combo.setName(name);
			temp_combo.setLocation(x, y);
			temp_combo.setVisible(true);
			temp_combo.setSize(cb_width, cb_height);
			setHFont(temp_combo);
			this.mFrame.add(temp_combo);
			obj_lst.add(temp_combo);
			return temp_combo;	
		}
		
		public JComboBox newComboBox(String name,Vector<String> data, int x, int y,ActionListener event) { //Выпадающий список
			
			JComboBox temp_combo = new JComboBox(data);
			temp_combo.setName(name);
			temp_combo.setLocation(x, y);
			temp_combo.setVisible(true);
			temp_combo.setSize(cb_width, cb_height);
			temp_combo.addActionListener(event);
			this.mFrame.add(temp_combo);
			setHFont(temp_combo);
			obj_lst.add(temp_combo);
			return temp_combo;	
		}
		
		
		public JComboBox newComboBox(String name,Vector<String> data, int x, int y,int width,int height) { //Выпадающий список с размерами
			
			JComboBox temp_combo = new JComboBox(data);
			temp_combo.setName(name);
			temp_combo.setLocation(x, y);
			temp_combo.setVisible(true);
			temp_combo.setSize(width,height);
			setHFont(temp_combo);
			
			this.mFrame.add(temp_combo);
			obj_lst.add(temp_combo);
			return temp_combo;
			
		}
		
		public JTextArea newTextArea (String name,int x,int y,int width,int height) { //Текстовая область
			JTextArea temp_area = new JTextArea();
			temp_area.setName(name);
			temp_area.setLocation(x, y);
			temp_area.setVisible(true);
			temp_area.setSize(width,height);
			temp_area.setBorder(new LineBorder(new Color(0,0,0),1));
			temp_area.setLineWrap(true);
			setHFont(temp_area);
			this.mFrame.add(temp_area);
			obj_lst.add(temp_area);
			return temp_area;
		}
		
		
		public JPanel newPanel(String name,int x,int y,int width,int height)  {
			JPanel temp = new JPanel();
			temp.setName(name);
			temp.setLocation(x,y);
			temp.setSize(width,height);
			temp.setVisible(true);
			setHFont(temp);
			mFrame.add(temp);
			obj_lst.add(temp);
			temp.setBorder(new LineBorder(new Color(0,0,0),1));
			return temp;	
		}
		
		public JCheckBox newCheckBox(String name,String text,boolean state) {
			JCheckBox temp = new JCheckBox(text,state);
			temp.addChangeListener(new check_click());
			temp.setName(name);
			setHFont(temp);
			JPanel temp_panel = (JPanel) this.getObject("ans_panel");
			temp_panel.add(temp);
			combo_lst.add(temp);
			return temp;
		}
		
		public void removeAllCheckBoxs() {
			
			for (JCheckBox temp:combo_lst) {
				temp.removeChangeListener(temp.getChangeListeners()[0]);
			}
			combo_lst.removeAllElements();
			Runtime.getRuntime().gc();
			
		}
		
		
		
		
		public void ClearPanel(String name) {
			JPanel temp = (JPanel) this.getObject(name);
		if (temp!=null) {
			temp.removeAll();
			temp.setLayout(new FlowLayout());
		}
			
		}
		
		public void RevalidatePanel(String name) {
			JPanel temp = (JPanel) this.getObject(name);
			if (temp!=null) {
				temp.revalidate();
				temp.repaint();
			}
		
		}
		
		public void SetTextToArea(String text,String name) {
			JTextArea temp = (JTextArea) this.getObject(name);
			temp.setText(text);
			
		}
		
		public void SetText(String text,String name) {
			JTextField temp = (JTextField) this.getObject(name);
			temp.setText(text);
		}
		
		public JSpinner  newSpinner (String name ,int x,int y, int width,int height) {
			JSpinner temp_spiner = new JSpinner();
			temp_spiner.setName(name);
			temp_spiner.setLocation(x, y);
			temp_spiner.setVisible(true);
			temp_spiner.setSize(width,height);
			setHFont(temp_spiner);
			this.mFrame.add(temp_spiner);
			obj_lst.add(temp_spiner);
			return temp_spiner;
			
		}
		public JProgressBar newProgressBar(String name,int max,int min,int x,int y,int width,int height) {
			JProgressBar temp_bar = new JProgressBar();
			temp_bar.setName(name);
			temp_bar.setLocation(x, y);
			temp_bar.setSize(width, height);
			temp_bar.setMaximum(max);
			temp_bar.setMinimum(min);
			setHFont(temp_bar);
			this.mFrame.add(temp_bar);
			obj_lst.add(temp_bar);
			return temp_bar;
		}
		
		public void setValueBar(String name,int val) {
			JProgressBar temp_bar = (JProgressBar) this.getObject(name);
			temp_bar.setValue(val);
		}
		
		public int getValueSpinner(String name) {
			JSpinner temp_spiner = (JSpinner)this.getObject(name);
			SpinnerNumberModel model = (SpinnerNumberModel) temp_spiner.getModel();
			return model.getNumber().intValue();
			
		}
		
		public void setValueSpinner (String name,int value) {
			JSpinner temp_spiner = (JSpinner) this.getObject(name);
			SpinnerNumberModel model = (SpinnerNumberModel) temp_spiner.getModel();
			model.setValue(value);
		}
		
		
		public String getTextFrom (String name) { //Получить текст из текстового поля с именем name
			JTextField temp =(JTextField) this.getObject(name);
			return temp.getText();	
		}

		public int getSelCombo(String name) { //Получить индекс выбраного значения в выпадающем списке
			JComboBox temp = (JComboBox) this.getObject(name);
			return temp.getSelectedIndex()+1;
		}
		
		public void setSelCombo(String name,int val) {
			JComboBox temp = (JComboBox) this.getObject(name);
			temp.setSelectedIndex(val);
		}
		
		public int getSelTable(String name) {
			JTable temp = (JTable) this.getObject(name);
			return temp.getSelectedRow()+1;
		}
		
		public void setSelTable(String name,int val) {
			JTable temp = (JTable) this.getObject(name);
			temp.getSelectionModel().setSelectionInterval(val, val);
		}
		
		public void nextSelList(String name) {
			JList temp = (JList) this.getObject(name);
			int index = temp.getSelectedIndex();
			if (index!=(temp.getModel().getSize()-1)) 	temp.setSelectedIndex(index+1);
			temp.repaint();
			
		}
		
		public void setSelList(String name,int val) {
			JList temp = (JList) this.getObject(name);
			temp.setSelectedIndex(val);
		}

		public int getSelList(String name) { //Получить выбранный индекс в списке
			JList temp = (JList) this.getObject(name);
			return temp.getSelectedIndex()+1;
		}

		public JComponent getObject (String name) { //Получить объект с именем name
			JComponent result_obj = null;
			for (JComponent obj : obj_lst) {
				if (obj.getName() == name) result_obj = obj;
			}
			return result_obj;
		}

		public void setVisibleElem(String name, boolean vis) { //Отображение/скрытие элемента на фрейме
			for (JComponent obj : obj_lst) {
				if (obj.getName() == name) obj.setVisible(vis);
			}
		}

		public void CompRepaint(String name) {
			JComponent temp = this.getObject(name);
			if (temp!=null)	temp.repaint();
		}

		public static void setCenterPosition(JFrame frame) { //Отцентрировать фрейм
	        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
	        Dimension frameSize = frame.getPreferredSize();

	        if (frameSize.height > screenSize.height) {
	             frameSize.height = screenSize.height;
	        }

	        if (frameSize.width > screenSize.width) {
	             frameSize.width = screenSize.width;
	        }

	        frame.setLocation((screenSize.width - frameSize.width) / 2,
	                  (screenSize.height - frameSize.height) / 2);
	   }
		
	class check_click implements ChangeListener {

		@Override
		public void stateChanged(ChangeEvent e) {
		
		JCheckBox temp  = (JCheckBox) e.getSource();
		test_loger.CheckChange(temp);
			
		}
		
	}
		
	}
